/**
 * 使用正则表达式验证密码，密码由大小写字母、数字、标点符号组成，长度范围为 8 - 20，
 * 必须包含数字、大写字母、小写字母、标点符号其中三种，不能含有空白字符和转义字符
 *
 * @param {string} password 待验证的密码
 * @return {boolean} 若密码符合规则返回 true，否则返回 false
 */
export function validatePassword(password) {
	if (password === null || password === undefined || password.length < 8 || password.length > 20) {
		return false;
	}

	// 检查是否包含空白字符或转义字符
	if (/.*[\s\\].*/.test(password)) {
		return false;
	}

	// 定义不同字符类型的正则表达式
	let criteriaMet = 0;
	if (/.*[0-9].*/.test(password)) { // 数字
		criteriaMet++;
	}
	if (/.*[A-Z].*/.test(password)) { // 大写字母
		criteriaMet++;
	}
	if (/.*[a-z].*/.test(password)) { // 小写字母
		criteriaMet++;
	}
	if (/.*[^a-zA-Z0-9\s].*/.test(password)) { // 标点符号
		criteriaMet++;
	}

	// 必须满足至少三种条件
	return criteriaMet >= 3;
}

/**
 * 使用正则表达式验证用户名，由大小写字母、数字、下划线组成，长度为 6 - 15，必须以大小写字母打头
 * 
 * @param {string} userName 待验证的用户名
 * @return {boolean} 若用户名符合规则返回 true，否则返回 false
 */
export function validateUserName(userName) {
	return userName !== null && userName !== undefined && userName !== '' && /^[a-zA-Z][a-zA-Z0-9_]{5,14}$/.test(
		userName);
}

/**
 * 是否为空的字符串
 *
 * @param str
 */
export function isEmptyStr(str) {
	if (null == str || 'undefined' == typeof(str) || '' == str) {
		return true;
	}
	if (!(Object.prototype.toString.call(str) === '[object String]')) {
		return true;
	}
	// 去除半角/全角空格
	str = str.replace(/\s*|[\u3000]*/g, '');
	if ('' == str) {
		return true;
	}
	return false;
}
/**
 * 身份证号合法性验证
 * 1.支持15位和18位身份证号
 * 2.支持地址编码、出生日期、校验位验证
 * @param code
 * @returns {boolean}
 * @constructor
 */
export function identityCodeValid(code) {
	let city = {
		11: "北京",
		12: "天津",
		13: "河北",
		14: "山西",
		15: "内蒙古",
		21: "辽宁",
		22: "吉林",
		23: "黑龙江 ",
		31: "上海",
		32: "江苏",
		33: "浙江",
		34: "安徽",
		35: "福建",
		36: "江西",
		37: "山东",
		41: "河南",
		42: "湖北 ",
		43: "湖南",
		44: "广东",
		45: "广西",
		46: "海南",
		50: "重庆",
		51: "四川",
		52: "贵州",
		53: "云南",
		54: "西藏 ",
		61: "陕西",
		62: "甘肃",
		63: "青海",
		64: "宁夏",
		65: "新疆",
		71: "台湾",
		81: "香港",
		82: "澳门",
		91: "国外 "
	};
	let tip = "";
	let passed = true;
	if (!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i
		.test(code)) {
		tip = "身份证号格式错误";
		passed = false;
	} else if (!city[code.substr(0, 2)]) {
		tip = "地址编码错误";
		passed = false;
	} else {
		// 18位身份证需要验证最后一位校验位
		if (code.length == 18) {
			code = code.split('');
			// ∑(ai×Wi)(mod 11)
			// 加权因子
			let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
			// 校验位
			let parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
			let sum = 0;
			let ai = 0;
			let wi = 0;
			for (var i = 0; i < 17; i++) {
				ai = code[i];
				wi = factor[i];
				sum += ai * wi;
			}
			let last = parity[sum % 11];
			if (parity[sum % 11] != code[17]) {
				tip = "校验位错误";
				passed = false;
			}
		}
	}
	return passed;
}
/**
 * 验证邮箱是否符合常见格式
 * @param {string} email - 待验证的邮箱地址
 * @return {boolean} 若邮箱符合格式返回 true，否则返回 false
 */
export function validateEmail(email) {
    // 使用正则表达式验证邮箱格式
    const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
    return emailRegex.test(email);
}

/**
 * 验证手机号码是否符合中国大陆的格式，支持所有已知号段
 * @param {string} phoneNumber - 待验证的手机号码
 * @return {boolean} 若手机号码符合格式返回 true，否则返回 false
 */
export function validateMobile(phoneNumber) {
    // 使用正则表达式验证手机号码格式
    const phoneRegex = /^(?:\+?86)?1(?:3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/;
    return phoneRegex.test(phoneNumber);
}
/**
 * 验证邮箱验证码是否符合格式
 * @param {string} emailCode - 待验证的邮箱验证码
 * @return {boolean} 若邮箱验证码符合格式返回 true，否则返回 false
 */
export function validateEmailCode(emailCode) {
    // 使用正则表达式验证邮箱验证码格式
    const emailCodeRegex = /^[a-zA-Z0-9]{6}$/;
    return emailCodeRegex.test(emailCode);
}
